package com.sh.rpc.fault.retry;

import com.github.rholder.retry.*;
import com.sh.rpc.model.RpcResponse;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;

/**
 * 固定时间重试
 * @author SH
 */
@Slf4j
public class FixedIntervalRetryStrategy implements RetryStrategy {
    // Callable是 Java 中的一个接口，主要用于在多线程环境中执行可以返回结果并且可能抛出异常的任务
    @Override
    public RpcResponse deRetry(Callable<RpcResponse> callable) throws Exception {
        Retryer<RpcResponse> retryer = RetryerBuilder.<RpcResponse>newBuilder()
                .retryIfExceptionOfType(Exception.class)  // 如果抛出异常，则重试
                .withWaitStrategy(WaitStrategies.fixedWait(3L, TimeUnit.SECONDS))  // 每次重试间隔3秒
                .withStopStrategy(StopStrategies.stopAfterAttempt(3))  // 最多重试3次
                .withRetryListener(new RetryListener() {
                    @Override
                    public <V> void onRetry(Attempt<V> attempt) {
                        log.info("第{}次重试", attempt.getAttemptNumber());
                    }
                }).build();
        return retryer.call(callable);
    }
}
